package com.ruoyi.scheme.service.decision.Impl;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.scheme.pojo.PlatFormAndSlopeEntity;
import com.ruoyi.scheme.pojo.RepairMeasure;
import com.ruoyi.scheme.service.decision.QuantitativeFormulaService;
import org.springframework.stereotype.Service;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;

@Service
public class QuantitativeFormulaServiceImpl implements QuantitativeFormulaService {

    /**
     * 应用定量公式计算修复措施的具体参数值
     * @param repairMeasure
     * @param platFormAndSlopeEntity
     * @return
     */
    @Override
    public RepairMeasure applyQuantitativeFormulas(RepairMeasure repairMeasure, PlatFormAndSlopeEntity platFormAndSlopeEntity) {
        if (repairMeasure == null || platFormAndSlopeEntity == null) {
            return repairMeasure;
        }

        JSONObject schemeJson = repairMeasure.getRepairScheme();
        
        // 检查repairScheme中是否包含有机肥相关信息
        if (schemeJson != null) {
            if (schemeJson.containsKey("organic_fertilizer") ||
                    (schemeJson.containsKey("measure") && schemeJson.getString("measure").contains("施加有机肥"))) {

                try {
                    // 使用公式 F = ((C0 - C1) × h × ρ × 100) / (Wom × DM × kh)
                    // 计算所需的有机肥料量
                    Double fertilizerAmount = calculateOrganicFertilizerAmount(platFormAndSlopeEntity);

                    // 将计算出的肥料量添加到修复方案中，单位为t/hm2
                    schemeJson.put("fertilizer_amount", String.format("%.2f", fertilizerAmount) + "t/hm2");

                } catch (Exception e) {
                    System.err.println("计算有机肥量时发生错误: " + e.getMessage());
                }
            }
            // 将修改后的JSONObject设置回repairMeasure
            repairMeasure.setRepairScheme(schemeJson);
        }
        return repairMeasure;
    }

    /**
     * 计算所需的有机肥料量
     * 使用公式: F = ((C0 - C1) × h × ρ × 100) / (Wom × DM × kh)
     * 其中：
     * C0: 目标土壤有机质含量（通过rndvi估算）
     * C1: 当前土壤有机质含量（som字段）
     * h: 土壤厚度（默认0.2m）
     * ρ: 土壤容重（默认1.3g/cm³）
     * Wom: 有机肥有机质含量（默认0.45）
     * DM: 有机肥干物质含量（默认0.85）
     * kh: 有机肥利用率（默认0.3）
     */
    private Double calculateOrganicFertilizerAmount(PlatFormAndSlopeEntity entity) {
        // 获取当前土壤有机质含量
        Double C1 = entity.getSom();
        if (C1 == null || C1 < 0) {
            C1 = 0.0;
        }

        // 通过rndvi估算目标土壤有机质含量C0
        Double rndvi = entity.getRndvi();
        Double C0;
        if (rndvi != null && rndvi > 0) {
            C0 = 10 * rndvi;
        } else {
            // 默认目标有机质含量为2.0%
            C0 = 2.0;
        }

        // 确保C0大于等于C1
        if (C0 < C1) {
            return 0.0; // 不需要额外的有机肥
        }

        // 设置默认参数值
        double h = 0.2;      // 土壤厚度，单位：m
        double rho = 1300;   // 土壤容重，单位：kg/m³ (1.3g/cm³ = 1300kg/m³)
        double Wom = 0.45;   // 有机肥有机质含量
        double DM = 0.85;    // 有机肥干物质含量
        double kh = 0.3;     // 有机肥利用率

        // 构建计算公式使用exp4j
        String formula = "((C0 - C1) * h * rho * 100) / (Wom * DM * kh)";

        try {
            // 创建表达式
            Expression expression = new ExpressionBuilder(formula)
                    .variables("C0", "C1", "h", "rho", "Wom", "DM", "kh")
                    .build()
                    .setVariable("C0", C0)
                    .setVariable("C1", C1)
                    .setVariable("h", h)
                    .setVariable("rho", rho)
                    .setVariable("Wom", Wom)
                    .setVariable("DM", DM)
                    .setVariable("kh", kh);

            // 计算结果
            double result = expression.evaluate();

            // 结果处理：确保结果为正值，并保留2位小数
            if (result < 0) {
                result = 0;
            }

            return Math.round(result * 100.0) / 100.0;

        } catch (Exception e) {
            System.err.println("公式计算错误: " + e.getMessage());
            return null;
        }
    }
}
